﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sispe.Entities;
using System.Data;
using System.Data.Objects;

namespace Sispe.Repository
{
    public class PersonaRepository : MasterRepository, IPersonaRepository
    {
        public List<PERSONA> GetAllFromPersona()
        {
            var query = from p in context.PERSONAs//.Include("SEXO").Include("ESTADO_CIVIL")
                        select p;
            

            return query.ToList();
        }

        public List<PERSONA> GetAllFromPersonaByDescripcion(string descripcion)
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL")
                        select p;
            if (descripcion != null && descripcion != string.Empty && descripcion != "")
            {
                query = from p in context.PERSONAs
                        where p.Dni.Contains(descripcion) ||
                                   p.ApeMaterno.ToUpper().Contains(descripcion) ||
                                   p.ApePaterno.ToUpper().Contains(descripcion) ||
                                   p.Nombres.ToUpper().Contains(descripcion)
                        select p;
            }
            //ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public PERSONA GetFromPersonaById(int id)
        {
            var query = from p in context.PERSONAs //.Include("SEXO").Include("ESTADO_CIVIL")
                        where p.IdPersona.Equals(id)
                        select p;

            return query.SingleOrDefault();
        }

        public PERSONA GetFromPersonaByDni(string dni)
        {
            var query = from p in context.PERSONAs
                        where p.Dni.Contains(dni)
                        select p;

            //ObjectContext.Refresh(RefreshMode.StoreWins, query);
            
            return query.SingleOrDefault();
        }

        public void AddPersona(PERSONA persona)
        {
            persona.DERECHO_HABIENTE = null;
            persona.ESTADO_CIVIL = null;
            persona.SEXO = null;
            persona.POSTULANTEs = null;
            persona.REFERENCIAs = null;
            persona.TELEFONOS = null;
            persona.TRABAJADOR = null;

            context.PERSONAs.Add(persona);
            context.SaveChanges();
        }

        public void UpdatePersona(PERSONA persona)
        {
            //context.PERSONAs.Attach(persona);
            persona.DERECHO_HABIENTE = null;
            context.Entry(persona.ESTADO_CIVIL).State = EntityState.Detached;
            context.Entry(persona.SEXO).State = EntityState.Detached;
            persona.POSTULANTEs = null;
            persona.REFERENCIAs = null;
            persona.TELEFONOS = null;
            //context.Entry(persona.TRABAJADOR).State = EntityState.Detached;

            context.Entry(persona).State = System.Data.EntityState.Modified;
            context.SaveChanges();
        }

        //registrar persona-trabajador
        public void AddPersonaTrabajador(PERSONA personaTrabajador)
        {
            //guardando TELFEONO-LINEA TELEFONICA
            foreach (var item in personaTrabajador.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                context.Entry(item).State = EntityState.Added;
            }

            //registramos primero a la PERSONA
            personaTrabajador.DERECHO_HABIENTE = null;
            personaTrabajador.POSTULANTEs = null;
            personaTrabajador.REFERENCIAs = null;

            //guardando ESPECIALIDADES del TRABAJADOR
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_ESPECIALIDAD)
            {
                item.ESPECIALIDAD_TRABAJADOR = null;
                context.Entry(item).State = EntityState.Added;
            }

            //guardando PADRES del TRABAJADOR
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_PADRES)
            {
                item.PADRE = null;
                context.Entry(item).State = EntityState.Added;
            }

            //guardando CAPACITACIONES del trabajador
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_CAPACITACION)
            {
                item.CAPACITACION = null;
                context.Entry(item).State = EntityState.Added;
            }

            //guardando CURRICULO del trabajador
            //personaTrabajador.TRABAJADOR.CURRICULO = null;
            if (personaTrabajador.TRABAJADOR.CURRICULO != null)
            {
                context.Entry(personaTrabajador.TRABAJADOR.CURRICULO).State = EntityState.Added;
            }

            if (personaTrabajador.TRABAJADOR.EXPEDIENTE != null)
            {
                context.Entry(personaTrabajador.TRABAJADOR.EXPEDIENTE).State = EntityState.Added;
            }
            


            //guardando FOTO del trabajador
            if (personaTrabajador.TRABAJADOR.FOTOes != null)
            {
                context.Entry(personaTrabajador.TRABAJADOR.FOTOes).State = EntityState.Added;
            }


            //registramos al ultimo TRABAJADOR   
            //context.Entry(personaTrabajador.TRABAJADOR.BANCO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.ESTUDIO.GRADO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.ESTUDIO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.REFERENCIA.PERSONA).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.REFERENCIA).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.REGIMEN_PENSIONARIO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.RURAL).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.SOCIO).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.UBICACION_TRABAJADOR).State = EntityState.Unchanged;
            //context.Entry(personaTrabajador.TRABAJADOR.UBIGEO).State = EntityState.Unchanged;
            

            context.PERSONAs.Add(personaTrabajador);
            context.SaveChanges();
        }

        //editar persona-trabajador
        public void UpdatePersonaTrabajador(PERSONA personaTrabajador)
        {
            var trabajador = context.TRABAJADORs.Find(personaTrabajador.IdPersona);
            var personaDB = context.PERSONAs.Find(personaTrabajador.IdPersona);

            personaDB.TRABAJADOR = trabajador;

            personaDB.ApeMaterno = personaTrabajador.ApeMaterno;
            personaDB.ApePaterno = personaTrabajador.ApePaterno;
            personaDB.Direccion = personaTrabajador.Direccion;
            personaDB.Dni = personaTrabajador.Dni;
            personaDB.Email = personaTrabajador.Email;
            personaDB.FechaNacimiento = personaTrabajador.FechaNacimiento;
            personaDB.IdEstadoCivil = personaTrabajador.IdEstadoCivil;
            personaDB.IdSexo = personaTrabajador.IdSexo;
            personaDB.Nombres = personaTrabajador.Nombres;

            personaDB.TRABAJADOR.Hijos = personaTrabajador.TRABAJADOR.Hijos;

            personaDB.TRABAJADOR.CondicionDomicilio = personaTrabajador.TRABAJADOR.CondicionDomicilio;
            //personaDB.TRABAJADOR.FechaIngreso = personaTrabajador.TRABAJADOR.FechaIngreso;
            personaDB.TRABAJADOR.Talla = personaTrabajador.TRABAJADOR.Talla;//
            personaDB.TRABAJADOR.AutogeneradoEsSalud = personaTrabajador.TRABAJADOR.AutogeneradoEsSalud;//
            personaDB.TRABAJADOR.GrupoSanguineo = personaTrabajador.TRABAJADOR.GrupoSanguineo;
            personaDB.TRABAJADOR.IdBanco = personaTrabajador.TRABAJADOR.IdBanco;
            personaDB.TRABAJADOR.IdEstudios = personaTrabajador.TRABAJADOR.IdEstudios;
            personaDB.TRABAJADOR.IdReferencia = personaTrabajador.TRABAJADOR.IdReferencia;
            personaDB.TRABAJADOR.IdRegimenPensionario = personaTrabajador.TRABAJADOR.IdRegimenPensionario;
            personaDB.TRABAJADOR.IdRural = personaTrabajador.TRABAJADOR.IdRural;
            personaDB.TRABAJADOR.IdSocio = personaTrabajador.TRABAJADOR.IdSocio;
            personaDB.TRABAJADOR.IdUbicacionTrabajador = personaTrabajador.TRABAJADOR.IdUbicacionTrabajador;
            personaDB.TRABAJADOR.IdUbigeo = personaTrabajador.TRABAJADOR.IdUbigeo;
            personaDB.TRABAJADOR.Nacionalidad = personaTrabajador.TRABAJADOR.Nacionalidad;
            personaDB.TRABAJADOR.NroConstanciaEstudios = personaTrabajador.TRABAJADOR.NroConstanciaEstudios;
            personaDB.TRABAJADOR.NroCuenta = personaTrabajador.TRABAJADOR.NroCuenta;
            personaDB.TRABAJADOR.NroCusp = personaTrabajador.TRABAJADOR.NroCusp;
            personaDB.TRABAJADOR.Edad = personaTrabajador.TRABAJADOR.Edad;
            personaDB.TRABAJADOR.Observacion = personaTrabajador.TRABAJADOR.Observacion;
            personaDB.TRABAJADOR.PaisEmisor = personaTrabajador.TRABAJADOR.PaisEmisor;
            personaDB.TRABAJADOR.Recomendable = personaTrabajador.TRABAJADOR.Recomendable;
            personaDB.TRABAJADOR.Sindicato = personaTrabajador.TRABAJADOR.Sindicato;
            personaDB.TRABAJADOR.Zapato = personaTrabajador.TRABAJADOR.Zapato;
            personaDB.ESTADO_CIVIL = personaTrabajador.ESTADO_CIVIL;
            personaDB.SEXO = personaTrabajador.SEXO;
            personaDB.TRABAJADOR.BANCO = personaTrabajador.TRABAJADOR.BANCO;
            personaDB.TRABAJADOR.ESTUDIO = personaTrabajador.TRABAJADOR.ESTUDIO;
            personaDB.TRABAJADOR.REFERENCIA = personaTrabajador.TRABAJADOR.REFERENCIA;
            personaDB.TRABAJADOR.REGIMEN_PENSIONARIO = personaTrabajador.TRABAJADOR.REGIMEN_PENSIONARIO;
            personaDB.TRABAJADOR.RURAL = personaTrabajador.TRABAJADOR.RURAL;
            personaDB.TRABAJADOR.SOCIO = personaTrabajador.TRABAJADOR.SOCIO;
            personaDB.TRABAJADOR.UBICACION_TRABAJADOR = personaTrabajador.TRABAJADOR.UBICACION_TRABAJADOR;
            personaDB.TRABAJADOR.UBIGEO = personaTrabajador.TRABAJADOR.UBIGEO;
            personaDB.TRABAJADOR.FOTOes = personaTrabajador.TRABAJADOR.FOTOes;
            personaDB.TRABAJADOR.EXPEDIENTE = personaTrabajador.TRABAJADOR.EXPEDIENTE;
            personaDB.TRABAJADOR.CURRICULO = personaTrabajador.TRABAJADOR.CURRICULO;

            foreach (var item in personaTrabajador.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                if (item.Id.Equals(0))
                {
                    item.PERSONAs = personaDB;
                    item.LINEA_TELEFONICA = context.LINEA_TELEFONICA.Find(item.IdLineaTelefonica);
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TELEFONOS.Add(item);
                }
                else
                {
                    context.TELEFONOes.Attach(item);
                    context.Entry(item).State = System.Data.EntityState.Modified;
                }
            }

            foreach (var item in personaTrabajador.TRABAJADOR.FOTOCHECKS)
            {
                if (item.Id.Equals(0))
                {
                    item.Dni = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.FOTOCHECKS.Add(item);

                }
                else
                {
                    context.FOTOCHECK.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }

            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_ESPECIALIDAD)
            {
                item.ESPECIALIDAD_TRABAJADOR = null;
                if (item.Id.Equals(0))
                {
                    item.TrabajadorId = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.TRABAJADOR_ESPECIALIDAD.Add(item);
                }
                else
                {
                    context.TRABAJADOR_ESPECIALIDAD.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }

            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_PADRES)
            {
                item.PADRE = null;
                if (item.Id.Equals(0))
                {
                    item.TrabajadorId = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.TRABAJADOR_PADRES.Add(item);
                }
                else
                {
                    context.TRABAJADOR_PADRES.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }//guardando CAPACITACIONES del trabajador
            foreach (var item in personaTrabajador.TRABAJADOR.TRABAJADOR_CAPACITACION)
            {
                item.CAPACITACION = null;
                if (item.Id.Equals(0))
                {
                    item.TrabajadorId = personaTrabajador.TRABAJADOR.Id;
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TRABAJADOR.TRABAJADOR_CAPACITACION.Add(item);
                }
                else
                {
                    context.TRABAJADOR_CAPACITACION.Attach(item);
                    context.Entry(item).State = EntityState.Modified;
                }
            }

            //guardando EXPEDIENTE del trabajador
            //context.Entry(personaTrabajador.TRABAJADOR.EXPEDIENTE).State = EntityState.Modified;
            //foreach (var item in personaTrabajador.TRABAJADOR.EXPEDIENTEs)
            //{
            //    item.DOCUMENTO = null;
            //    if (item.IdDocumento.Equals(0))
            //    {
            //        item.IdTrabajador = personaTrabajador.TRABAJADOR.Id;
            //        context.Entry(item).State = EntityState.Added;
            //        personaDB.TRABAJADOR.EXPEDIENTEs.Add(item);
            //    }
            //    else
            //    {
            //        context.EXPEDIENTEs.Attach(item);
            //        context.Entry(item).State = EntityState.Modified;
            //    }
            //}

            //context.Entry(personaDB.TRABAJADOR.FOTOes).State = EntityState.Modified;
            context.Entry(personaDB).State = EntityState.Modified;
            context.Entry(personaDB.TRABAJADOR).State = EntityState.Modified;
            //context.Entry(personaDB.TRABAJADOR.EXPEDIENTE).State = EntityState.Modified;
            //context.Entry(personaDB.TRABAJADOR.CURRICULO).State = EntityState.Modified;
            context.SaveChanges();
        }

        public void AddPersonaPostulante(PERSONA personaPostulante)
        {
            //guardando TELFEONO-LINEA TELEFONICA
            foreach (var item in personaPostulante.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                context.Entry(item).State = EntityState.Added;
            }


            personaPostulante.DERECHO_HABIENTE = null;

            personaPostulante.REFERENCIAs = null;


            context.PERSONAs.Add(personaPostulante);

            context.SaveChanges();
        }

        public void UpdatePersonaPostulante(PERSONA personaPostulante)
        {
            var postulante = context.POSTULANTEs.Find(personaPostulante.IdPersona);
            var personaDB = context.PERSONAs.Find(personaPostulante.IdPersona);

            personaDB.POSTULANTEs = postulante;

            personaDB.ApeMaterno = personaPostulante.ApeMaterno;
            personaDB.ApePaterno = personaPostulante.ApePaterno;
            personaDB.Direccion = personaPostulante.Direccion;
            personaDB.Dni = personaPostulante.Dni;
            personaDB.Email = personaPostulante.Email;
            personaDB.FechaNacimiento = personaPostulante.FechaNacimiento;
            personaDB.IdEstadoCivil = personaPostulante.IdEstadoCivil;
            personaDB.IdSexo = personaPostulante.IdSexo;
            personaDB.Nombres = personaPostulante.Nombres;

            personaDB.ESTADO_CIVIL = personaPostulante.ESTADO_CIVIL;
            personaDB.SEXO = personaPostulante.SEXO;

            personaDB.POSTULANTEs.Disponibilidad = personaPostulante.POSTULANTEs.Disponibilidad;
            personaDB.POSTULANTEs.Observacion = personaPostulante.POSTULANTEs.Observacion;

            foreach (var item in personaPostulante.TELEFONOS)
            {
                item.LINEA_TELEFONICA = null;
                if (item.Id.Equals(0))
                {
                    item.PERSONAs = personaDB;
                    item.LINEA_TELEFONICA = context.LINEA_TELEFONICA.Find(item.IdLineaTelefonica);
                    context.Entry(item).State = EntityState.Added;
                    personaDB.TELEFONOS.Add(item);
                }
                else
                {
                    context.TELEFONOes.Attach(item);
                    context.Entry(item).State = System.Data.EntityState.Modified;
                }
            }

            context.Entry(personaDB).State = EntityState.Modified;
            context.SaveChanges();
        }


        public List<PERSONA> GetAllFromOnlyPersona()
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("DERECHO_HABIENTE")
                        where p.TRABAJADOR == null && p.DERECHO_HABIENTE.Count == 0
                        select p;
            //ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }


        public PERSONA GetFromOnlyPersonaByDni(string dni)
        {
            var query = from p in context.PERSONAs.Include("SEXO").Include("ESTADO_CIVIL").Include("DERECHO_HABIENTE")
                        where p.Dni.Contains(dni) //&& p.TRABAJADOR == null && p.DERECHO_HABIENTE.Count == 0
                        select p;
            //ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.SingleOrDefault();
        }
    }
}
